# +----------------------------------------------------------------------
# | DjangoAdmin敏捷开发框架 [ 赋能开发者，助力企业发展 ]
# +----------------------------------------------------------------------
# | 版权所有 2021~2024 北京DjangoAdmin研发中心
# +----------------------------------------------------------------------
# | Licensed LGPL-3.0 DjangoAdmin并不是自由软件，未经许可禁止去掉相关版权
# +----------------------------------------------------------------------
# | 官方网站: https://www.djangoadmin.cn
# +----------------------------------------------------------------------
# | 作者: @一米阳光 团队荣誉出品
# +----------------------------------------------------------------------
# | 版权和免责声明:
# | 本团队对该软件框架产品拥有知识产权（包括但不限于商标权、专利权、著作权、商业秘密等）
# | 均受到相关法律法规的保护，任何个人、组织和单位不得在未经本团队书面授权的情况下对所授权
# | 软件框架产品本身申请相关的知识产权，禁止用于任何违法、侵害他人合法权益等恶意的行为，禁
# | 止用于任何违反我国法律法规的一切项目研发，任何个人、组织和单位用于项目研发而产生的任何
# | 意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失 (包括但不限于直接、间接、
# | 附带或衍生的损失等)，本团队不承担任何法律责任，本软件框架禁止任何单位和个人、组织用于
# | 任何违法、侵害他人合法利益等恶意的行为，如有发现违规、违法的犯罪行为，本团队将无条件配
# | 合公安机关调查取证同时保留一切以法律手段起诉的权利，本软件框架只能用于公司和个人内部的
# | 法律所允许的合法合规的软件产品研发，详细声明内容请阅读《框架免责声明》附件；
# +----------------------------------------------------------------------

import aioredis
from aioredis import create_redis_pool, Redis
from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware
from starlette.requests import Request
from uvicorn.middleware.proxy_headers import ProxyHeadersMiddleware

from config.env import REDIS_PASSWORD, REDIS_HOST, REDIS_PORT, REDIS_INDEX


# 注册自定义中间件
def register_middleware(app: FastAPI):
    """
    请求响应拦截 hook

    https://fastapi.tiangolo.com/tutorial/middleware/
    :param app:
    :return:
    """

    @app.middleware("http")
    async def logger_request(request: Request, call_next):
        # 此处可以自定义业务...

        # 以上是请求前处理...
        response = await call_next(request)
        # 以下是请求后处理...

        # 请求放行
        return response


# 注册跨域中间件
def register_cros(app: FastAPI):
    # 允许发出跨域请求的源列表
    origins = [
        "http://localhost:8080",
        # 以下添加实际使用时自定义前端访问域名
        "https://duoduojilu.yuduoduogongju.com"
    ]
    # 配置中间件
    app.add_middleware(ProxyHeadersMiddleware)
    app.add_middleware(
        CORSMiddleware,
        # 允许访问的源
        allow_origins=origins,
        # 支持 cookie
        allow_credentials=True,
        # 允许使用的请求方法
        allow_methods=['OPTIONS', 'GET', 'POST', 'DELETE', 'PUT'],
        # 允许携带的 Headers
        allow_headers=["*"],
        # 设置浏览器缓存 CORS 响应的最长时间(以秒为单位)，默认600
        max_age=3600
    )


# 注册Redis中间件
def register_redis(app: FastAPI):
    # 定义线程池
    async def get_redis_pool() -> Redis:
        redis = await create_redis_pool(
            f"redis://:" + REDIS_PASSWORD + "@" + REDIS_HOST + ":" + REDIS_PORT + "/" + REDIS_INDEX + "?encoding=utf-8")
        return redis

    @app.on_event("startup")
    async def startup_event():
        # app.state.redis = await get_redis_pool()
        app.state.redis = await aioredis.create_redis(address=(REDIS_HOST, REDIS_PORT),
                                                      password=REDIS_PASSWORD if REDIS_PASSWORD else None,
                                                      db=int(REDIS_INDEX),
                                                      encoding="utf-8")
        print(f"redis成功--->>{app.state.redis}")

    @app.on_event("shutdown")
    async def shutdown_event():
        app.state.redis.close()
        await app.state.redis.wait_closed()
